/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.EvolucionEnfermeriaDeInternacionFisica;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EvolucionEnfermeriaDeInternacion;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class EvolucionEnfermeriaDeInternacionLogica extends CapaLogica {

    /**
     * Crea y persiste la evolución enfermeria de la internación para el paciente.
     *
     * @param datosEvolucionEnfermeriaDeInternacion Los datos correspondientes a la ficha
     * @param diagnosticoYTriageInternacion La internacion con su respectivo
     * diagnostico y triage para asociar la evolucion enfermeria
     * @param evolucionEnfermeriaDeInternacion La evolucion de enfermeria a agregar/modificar
     * @param idEvolucionEnfermeriaDeInternacion El arreglo donde se guardara el id del objeto creado
     * para su poterior recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarEvolucionEnfermeriaDeInternacion(
            Object[] datosEvolucionEnfermeriaDeInternacion,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion,
            EvolucionEnfermeriaDeInternacion evolucionEnfermeriaDeInternacion,
             int[] idEvolucionEnfermeriaDeInternacion) {

        //Si es una modificacion
        if (idEvolucionEnfermeriaDeInternacion[0] != -1) {
            //Escribe el log
            backUpModificacion(idEvolucionEnfermeriaDeInternacion[0]);
        }

        evolucionEnfermeriaDeInternacion =
                crearObjetoEvolucionEnfermeriaDeInternacion(
                datosEvolucionEnfermeriaDeInternacion, evolucionEnfermeriaDeInternacion);

        //Setea los datos pertinentes a internacion
        evolucionEnfermeriaDeInternacion.setDiagnosticoYTriageInternacion(
                diagnosticoYTriageInternacion);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(evolucionEnfermeriaDeInternacion)) {
            idEvolucionEnfermeriaDeInternacion[0] =
                    evolucionEnfermeriaDeInternacion.
                    getIdEvolucionEnfermeriaDeInternacion();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto evolución con los datos pasados por parámetro.
     *
     * @param datosEvolucionEnfermeriaDeInternacion Los datos a cargar
     * @param evolucionEnfermeriaDeInternacion La evolucion de enfermeria a crear/obtener
     * @return El objeto Evolucion creado
     */
    private static EvolucionEnfermeriaDeInternacion crearObjetoEvolucionEnfermeriaDeInternacion(
            Object[] datosEvolucionEnfermeriaDeInternacion, 
            EvolucionEnfermeriaDeInternacion evolucionEnfermeriaDeInternacion){

        if (evolucionEnfermeriaDeInternacion == null) {
            evolucionEnfermeriaDeInternacion =
                    new EvolucionEnfermeriaDeInternacion();
        }

        evolucionEnfermeriaDeInternacion.setHoraEvolucionEnfermeriaDeInternacion(datosEvolucionEnfermeriaDeInternacion[
                EVOLUCION_ENFERMERIA_DE_INTERNACION_HORA].toString());

        evolucionEnfermeriaDeInternacion.setFechaEvolucionEnfermeriaDeInternacion(
                (Date) datosEvolucionEnfermeriaDeInternacion[EVOLUCION_ENFERMERIA_DE_INTERNACION_FECHA]);

        evolucionEnfermeriaDeInternacion.setDescripcionEvolucionEnfermeriaDeInternacion(
                datosEvolucionEnfermeriaDeInternacion[EVOLUCION_ENFERMERIA_DE_INTERNACION_DESCRIPCION].toString());

        evolucionEnfermeriaDeInternacion.setApellidoProfesionalEvolucionEnfermeriaDeInternacion(
                datosEvolucionEnfermeriaDeInternacion[EVOLUCION_ENFERMERIA_DE_INTERNACION_APELLIDO_PROFESIONAL].toString());

        evolucionEnfermeriaDeInternacion.setNombreProfesionalEvolucionEnfermeriaDeInternacion(
                datosEvolucionEnfermeriaDeInternacion[EVOLUCION_ENFERMERIA_DE_INTERNACION_NOMBRE_PROFESIONAL].toString());

        return evolucionEnfermeriaDeInternacion;
    }

    /**
     * Retorna el vector de EvolucionEnfermeriaDeInternacion pertenecientes a
     * un paciente tiene asociadas.
     *
     * @param idPaciente El id del paciente a consultar
     * @return El vector de objetos EvolucionEnfermeriaDeInternacion consultado
     */
    public static Vector<EvolucionEnfermeriaDeInternacion>
            getVectorEvolucionEnfermeriaDeInternacionPorIdPaciente(int idPaciente) {
        return EvolucionEnfermeriaDeInternacionFisica.
                getVectorEvolucionEnfermeriaDeInternacionPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el objeto EvolucionEnfermeriaDeInternacion según el id.
     *
     * @param idEvolucionEnfermeriaDeInternacion  El id de la EvolucionEnfermeriaDeInternacion
     * @return El objeto EvolucionEnfermeriaDeInternacion consultado, null si no existe
     */
    public static EvolucionEnfermeriaDeInternacion 
            getEvolucionEnfermeriaDeInternacionPorId(
            int idEvolucionEnfermeriaDeInternacion) {
        return EvolucionEnfermeriaDeInternacionFisica.
                getEvolucionEnfermeriaDeInternacionPorId(
                idEvolucionEnfermeriaDeInternacion);
    }

    /**
     * Retorna las evoluciones enfermeria de internacion cargadas del diagnostico
     * y triage internacion
     *
     * @param idDiagnosticoYTriageInternacion El id deldiagnostico y triage internacion
     * @return El vector EvolucionEnfermeriaDeInternacion
     */
    public static Vector<EvolucionEnfermeriaDeInternacion>
            getVectorEvolucionEnfermeriaDeInternacionPorIdDiagnosticoYTriageInternacion(
            int idDiagnosticoYTriageInternacion) {
        return EvolucionEnfermeriaDeInternacionFisica.
                getVectorEvolucionEnfermeriaDeInternacionPorIdDiagnosticoYTriageInternacion(
                idDiagnosticoYTriageInternacion);
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    EvolucionEnfermeriaDeInternacion.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        EvolucionEnfermeriaDeInternacion evolucionEnfermeriaDeInternacion =
                EvolucionEnfermeriaDeInternacionLogica.
                getEvolucionEnfermeriaDeInternacionPorId(idObjeto);

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                evolucionEnfermeriaDeInternacion.
                getArchivoLogEvolucionEnfermeriaDeInternacion());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogEvolucion(evolucionEnfermeriaDeInternacion, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        evolucionEnfermeriaDeInternacion.setArchivoLogEvolucionEnfermeriaDeInternacion(
                bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param evolucionEnfermeriaDeInternacion El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogEvolucion(
            EvolucionEnfermeriaDeInternacion evolucionEnfermeriaDeInternacion,
            String rutaLog) {
        try {
            //Evolucion
            String evolucionEnfermeriaDeInternacionString =
                    getEvolucionEnfermeriaDeInternacionString(
                    evolucionEnfermeriaDeInternacion);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            evolucionEnfermeriaDeInternacionString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(evolucionEnfermeriaDeInternacionString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }


    /**
     * Retorna todo el objeto EvolucionEnfermeriaDeInternacion en string.
     *
     * @param evolucionEnfermeriaDeInternacion El objeto a escribir
     */
    public static String getEvolucionEnfermeriaDeInternacionString(
            EvolucionEnfermeriaDeInternacion evolucionEnfermeriaDeInternacion) {
        String evolucionEnfermeriaDeInternacionString =
                "idEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getIdEvolucionEnfermeriaDeInternacion() + "\n" +
                "horaEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getHoraEvolucionEnfermeriaDeInternacion() + "\n" +
                "fechaEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getFechaEvolucionEnfermeriaDeInternacion() + "\n" +
                "apellidoProfesionalEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getApellidoProfesionalEvolucionEnfermeriaDeInternacion() + "\n" +
                "nombreProfesionalEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getNombreProfesionalEvolucionEnfermeriaDeInternacion() + "\n" +
                "descripcionEvolucionEnfermeriaDeInternacion: " +
                evolucionEnfermeriaDeInternacion.getDescripcionEvolucionEnfermeriaDeInternacion() + "\n";

        return evolucionEnfermeriaDeInternacionString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la evolución
     *  enfermería de internación corresopondiente a la práctica internación.
     *
     * @param evolucion La evolución correspondiente a la práctica internación
     * @return El String que contiene el HTML
     */
    public static String getEvolucionEnfermeriaDeInternacionHTML(
            EvolucionEnfermeriaDeInternacion evolucioneEnfermeriaDeInternacion) {

        String evolucionEnfermeriaDeInternacionHTML = "";
        
            if (evolucioneEnfermeriaDeInternacion != null) {
             evolucionEnfermeriaDeInternacionHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">ENFERMERÍA DE INTERNACIÓN</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(evolucioneEnfermeriaDeInternacion.
                    getFechaEvolucionEnfermeriaDeInternacion()) + " - " +
                    evolucioneEnfermeriaDeInternacion.getHoraEvolucionEnfermeriaDeInternacion() + "</font><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Estado: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaLogica.capitalizeFirstLetter(evolucioneEnfermeriaDeInternacion.getDiagnosticoYTriageInternacion().
                    getEstadoDiagnosticoYTriageInternacion()) + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Evolucionó: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    evolucioneEnfermeriaDeInternacion.getApellidoProfesionalEvolucionEnfermeriaDeInternacion() + ", " + evolucioneEnfermeriaDeInternacion.getNombreProfesionalEvolucionEnfermeriaDeInternacion() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Descripción de la evolución enfermedad de internación:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    evolucioneEnfermeriaDeInternacion.getDescripcionEvolucionEnfermeriaDeInternacion().replace("\n", "<br>") + "</font><br><br>";
        } else {
            evolucionEnfermeriaDeInternacionHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">ENFERMERÍA DE INTERNACIÓN</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }
        
        return evolucionEnfermeriaDeInternacionHTML;
    }

}
